// #include <iostream>
// #include<string>
// #include<functional>
// #include<algorithm>
// #include<vector>
//
// using namespace std;
// //函数适配器
//
// //提供一个接口 两个参数的函数指针
// template<typename Pr>
// void print_data(Pr func,int a,int b)
// {
//     func(a,b);
// }
//
// void sum(int a,int b)
// {
//     cout << a+b << endl;
// }
//
// void  test(int a,int b,int c)
// {
//     cout << a+ b+c << endl;
// }
//
//
//
//
//
// void test_bind()
// {
//     // print_data(test_bind,1,2);
//
//     //适配器可以让你实现不同的调用形态 绑定默认参数
//     auto func = bind(test,std::placeholders::_1,std::placeholders::_2,0);
//     func(1,2);
//     func(1,2,4); //这个传参是无效的
//
//     // print_data(test,1,2);
//
//     print_data(func,1,2);
// }
//
// class Test
// {
// public:
//     void printTest(int a,int b,int c)
//     {
//         cout << "类中成员函数" << endl;
//     }
// private:
// };
//
// void test_bind_function()
// {
//     auto f1 = bind(test,1,2,3);
//     f1();
//     //绑定类中的成员函数
//
//     Test object;
//     object.printTest(1,2,3);
//
//
//     //第一个类方法  对象地址
//     auto f2 = bind(&Test::printTest,&object,1,2,3);
//     f2();
//
// }
//
// void prnint_test(int a,string str,Test object)
// {
//     cout << "bind 函数调整调用参数顺序" << endl;
// }
//
// void test_modify_param()
// {
//     prnint_test(1,"str",Test{});
//
//     auto func = bind(prnint_test,std::placeholders::_2,std::placeholders::_3,std::placeholders::_1);
//
//     //func("str",Test{},1); 这个是错的
//     //  //1 int //2 string,3 Test std::placeholders::_2调用函数的参数类型
//     func(Test{},1,"str");
// }
//
// int main()
// {
//
//     // test_bind();
//     test_bind_function();
//     return 0;
// }